package Framework.Fachadas;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import Framework.Entidades.Estudiante.Estudiante;
import Framework.Fabricas.FabricaConexion;
import Framework.Fabricas.FabricaCriterio;
import Framework.Fabricas.FabricaIntermediario;
import Framework.Utilidades.Criterio;
import Framework.Utilidades.CriterioCompuesto;
import Framework.Utilidades.CriterioSimple;

public class FachadaPersistenciaInterna {

    public static FachadaPersistenciaInterna instancia;
    public Connection conexion = null;
    private static final ThreadLocal threadEntityTransaction = new ThreadLocal();

    public FachadaPersistenciaInterna() {}

    public static synchronized FachadaPersistenciaInterna getInstancia() {
        if (instancia == null) {
            FachadaPersistenciaInterna instancia = new FachadaPersistenciaInterna();
            return instancia;
        }
        else {
            return instancia;
        }
    }

    public ArrayList BuscarCriterio(String clase, Criterio criterios) {
        return FabricaIntermediario.getInstancia().getIntermediario(clase).BuscarCriterio(criterios);
    }

    public Object BuscarOID(String clase, String oid) {
        return FabricaIntermediario.getInstancia().getIntermediario(clase).BuscarOID(oid);
    }

    public void Guardar(String clase, Object objeto) {
        FabricaIntermediario.getInstancia().getIntermediario(clase).Guardar(objeto);
    }

    public CriterioSimple getCriterioSimple(String atributo, String operador, Object valor) {
        return FabricaCriterio.getInstancia().getCriterioSimple(atributo, operador, valor);
    }

    public CriterioCompuesto getCriterioCompuesto(CriterioSimple criterioSimple1, String operador, CriterioSimple criterioSimple2) {
        return FabricaCriterio.getInstancia().getCriterioCompuesto(criterioSimple1, operador, criterioSimple2);
    }

    public void IniciarTX() throws SQLException {
        conexion = FabricaConexion.getConexion();
        conexion.setAutoCommit(false);// para que sean atomicas las Tx.
        conexion.createStatement().execute("BEGIN");
        threadEntityTransaction.set(conexion);        
    }    
    
    public void CommitTX() throws SQLException {
        conexion.commit();
        conexion.close();
    }

    public void FinalizarTX() throws SQLException {
        try {
            conexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(FachadaPersistenciaInterna.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void RollbackTX() throws SQLException {
        try {
            conexion.rollback();
        } catch (SQLException ex) {
            Logger.getLogger(FachadaPersistenciaInterna.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}